﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NUnit.Framework;

using Working.Domínio.Vendas;
using Working.Domínio.Produtos;

namespace Working.Domínio.Vendas.Teste
{
    [TestFixture]
    public class TesteItemDeVenda
    {
        [Test]
        public void TestaConstrutor1()
        {
            Produto produto = new Produto();
            int quantidade = 5;
            decimal valorUnitário = 200;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade, valorUnitário);

            Assert.AreEqual(produto, item.Produto);
            Assert.AreEqual(quantidade, item.Quantidade);
            Assert.AreEqual(valorUnitário, item.ValorUnitário);
        }

        [Test]
        public void TestaConstrutor2()
        {
            Produto produto = new Produto();
            produto.Preço = 2150.50M;
            int quantidade = 5;            

            ItemDeVenda item = new ItemDeVenda(produto, quantidade);

            Assert.AreEqual(produto, item.Produto);
            Assert.AreEqual(quantidade, item.Quantidade);
            Assert.AreEqual(produto.Preço, item.ValorUnitário);
        }

        [Test]
        [ExpectedException(typeof(ArgumentException))]
        public void TestaConstrutorComProdutoNulo()
        {
            Produto produto = null;
            int quantidade = 1;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade);
        }

        [Test]
        public void TestaSubTotalSemValorUnitário()
        {
            Produto produto = new Produto();
            produto.Preço = 110.50M;
            int quantidade = 5;
            decimal resultado = 552.50M;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade);
            Assert.AreEqual(resultado, item.SubTotal);
        }

        [Test]
        public void TestaSubTotalComValorUnitário()
        {
            Produto produto = new Produto();
            produto.Preço = 110.50M;
            int quantidade = 5;
            decimal valorUnitário = 100.00M;
            decimal resultado = 500.00M;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade, valorUnitário);
            Assert.AreEqual(resultado, item.SubTotal);
        }

        [Test]
        public void TestaPropriedades()
        {
            Produto produto = new Produto();
            int quantidade = 5;
            decimal valorUnitário = 200M;

            ItemDeVenda item = new ItemDeVenda(produto, 1);
            item.Quantidade = quantidade;
            item.ValorUnitário = valorUnitário;

            Assert.AreEqual(quantidade, item.Quantidade);
            Assert.AreEqual(valorUnitário, item.ValorUnitário);
        }


        [Test]
        [ExpectedException(typeof(QuantidadeDeItensInválidaException))]
        public void TestaQuantidadeComValorZerado()
        {
            Produto produto = new Produto();
            int quantidade = 1;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade);
            item.Quantidade -= 1;
        }

        [Test]
        [ExpectedException(typeof(QuantidadeDeItensInválidaException))]
        public void TestaQuantidadeComValorNegativo()
        {
            Produto produto = new Produto();
            int quantidade = 1;

            ItemDeVenda item = new ItemDeVenda(produto, quantidade);
            item.Quantidade -= 5;
        }

        [Test]
        public void TestaValorUnitário()
        {
            decimal valorDoProduto = 300m;
            Produto produto = new Produto("001", "Produto 1", valorDoProduto);
            ItemDeVenda item = new ItemDeVenda(produto, 1);

            //Realiza teste com valor original do produto
            Assert.AreEqual(valorDoProduto, item.ValorUnitário);
            
            //Realiza teste alterando o preço do produto
            produto.Preço += 100m;
            Assert.AreEqual(valorDoProduto, item.ValorUnitário);

        }
    }
}
